#-------------------------------------------------------------------------------
# Name:        Main Class
# Purpose:
#
# Author:      psoifer
#
# Created:     12/03/2013
# Copyright:   (c) psoifer 2013
# Licence:     <your licence>
#-------------------------------------------------------------------------------

import pygame
import personaje
import mapa
import random
import pantallas

def detectar_colisiones(colisionables,personaje):
    retorno = False
    for col in colisionables:
       if pygame.sprite.spritecollide(personaje,colisionables,False,pygame.sprite.collide_mask):
            retorno=True
    return retorno

def detectar_colisiones_npc(listaNPC,npc,actual):
    retorno=False
    for i in range(0,len(listaNPC)):
        if i!=actual:
            if pygame.sprite.spritecollide(npc,listaNPC[i],false,pygame.sprite.collide_mask):
                retorno=True
    return retorno

def main():
    pygame.init()

    #-----------------------------
    #-------------FLAGS-----------
    #-----------------------------
    FlagShowHelp=False #Mostrar Help
    FlagHabla=False #Conversaciones
    FlagPausa=False #Pausa

    #personaje principal
    personajePrincipal=personaje.Personaje("Dracux","Caballero")
    Ppsprite=pygame.sprite.Sprite()
    Ppsprite.image=pygame.image.load(personajePrincipal.getImagen("s"))
    Ppsprite.rect=pygame.image.load(personajePrincipal.getImagen("s")).get_rect()
    Ppsprite.rect.top=1
    Ppsprite.rect.left=1
    #Listas de sprites
    scasas45=[] #Sprites Casas comunes puerta cerrada
    npcs=[] #Sprites NPCS
    ciclos=[] #ciclos de movimientos para los NPCS
    ciclo=1 #El comienzo del ciclo
    imagenes=[] #imagenes
    #COLORES
    verde=(9,255,0)
    negro=(0,0,0)
    azul=(0,0,255)
    blanco=(255,255,255)

    #Para los textos de personajes
    texto_personaje=""
    nom_personaje=""

    #FUENTES
    BAntiqueBookCover=pygame.font.Font("fuentes/Antique Book Cover.otf", 24)
    MAntiqueBookCover=pygame.font.Font("fuentes/Antique Book Cover.otf", 18)
    SAntiqueBookCover=pygame.font.Font("fuentes/Antique Book Cover.otf", 15)

    #Pantalla
    pantalla=pygame.display.set_mode([800,600]) #Pantalla superficie principal
    pantalla.fill(verde)

    #----------------------
    #-----SUPERFICIES------
    #----------------------

    #Superficie para los datos del personaje
    panel=pygame.Surface([800,50])
    panel.fill(negro)

    #Superficie Help
    PantallaHelp=pantallas.Pantallas("Help")
    panelHelp=pygame.Surface(PantallaHelp.tamano)
    panelHelp.fill(negro)

    #Superficie Pausa
    PantallaPausa=pantallas.Pantallas("Pausa")
    panelPausa=pygame.Surface(PantallaPausa.tamano)
    panelPausa.fill(negro)

    pygame.display.set_caption("Rindellia 0.0.G")
    salir=False
    mainLoopTimer=pygame.time.Clock()


    mapaActual=mapa.Mapa("Rindellia")

    while salir == False:
        if(ciclo==10): #El ciclo consta de 10 pasos
            ciclo=1
        if len(npcs)==0: #npcs sin nada
            for i in range(0,mapaActual.get_nro_npc()):
                spriteTemp=pygame.sprite.Sprite()
                imagenTemp=pygame.image.load(mapaActual.get_npc(i).get_image("s"))
                spriteTemp.image=imagenTemp
                spriteTemp.rect=imagenTemp.get_rect()
                spriteTemp.rect.top=mapaActual.get_npc(i).get_posx()
                spriteTemp.rect.left=mapaActual.get_npc(i).get_posy()
                npcs.append(spriteTemp)
                ciclos.append(mapaActual.get_npc(i).get_ciclo())
        if len(scasas45)==0: #Casas45 vacias
            for i in range(0,mapaActual.get_cantidad_de_casas()):
                spriteTemp=pygame.sprite.Sprite()
                imagenTemp=pygame.image.load(mapaActual.get_tipo_casa())
                spriteTemp.image=imagenTemp
                spriteTemp.rect=spriteTemp.rect=imagenTemp.get_rect()
                spriteTemp.rect.top=mapaActual.get_some_casay(i)
                spriteTemp.rect.left=mapaActual.get_some_casax(i)
                scasas45.append(spriteTemp)
        if len(imagenes)==0: #Si imagenes esta vacio
            for i in range(0,mapaActual.get_cantidad_imagenes()):
                imagenTemp=pygame.image.load("imagenes/imagenes/"+mapaActual.get_some_imagen(i))
                imagenes.append(imagenTemp)

        #Eventos posibles
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                salir=True
            #if event.type == pygame.MOUSEBUTTONDOWN:
            #    (rectper.left,rectper.top)=pygame.mouse.get_pos()
            if event.type == pygame.KEYDOWN:
                actualTop = Ppsprite.rect.top
                actualLeft = Ppsprite.rect.left
                if event.key == pygame.K_LEFT:
                    Ppsprite.image=pygame.image.load(personajePrincipal.getImagen("w"))
                    Ppsprite.rect=pygame.image.load(personajePrincipal.getImagen("w")).get_rect()
                    Ppsprite.rect.top=actualTop
                    Ppsprite.rect.left=actualLeft
                    Ppsprite.rect.move_ip(-10,0)
                    if detectar_colisiones(scasas45,Ppsprite)==True or detectar_colisiones(npcs,Ppsprite)==True:
                        Ppsprite.rect.move_ip(10,0)
                if event.key == pygame.K_RIGHT:
                    Ppsprite.image=pygame.image.load(personajePrincipal.getImagen("e"))
                    Ppsprite.rect=pygame.image.load(personajePrincipal.getImagen("e")).get_rect()
                    Ppsprite.rect.top=actualTop
                    Ppsprite.rect.left=actualLeft
                    Ppsprite.rect.move_ip(10,0)
                    if detectar_colisiones(scasas45,Ppsprite)==True or detectar_colisiones(npcs,Ppsprite)==True:
                        Ppsprite.rect.move_ip(-10,0)
                if event.key == pygame.K_DOWN:
                    Ppsprite.image=pygame.image.load(personajePrincipal.getImagen("s"))
                    Ppsprite.rect=pygame.image.load(personajePrincipal.getImagen("s")).get_rect()
                    Ppsprite.rect.top=actualTop
                    Ppsprite.rect.left=actualLeft
                    Ppsprite.rect.move_ip(0,10)
                    if detectar_colisiones(scasas45,Ppsprite)==True or detectar_colisiones(npcs,Ppsprite)==True:
                        Ppsprite.rect.move_ip(0,-10)
                if event.key == pygame.K_UP:
                    Ppsprite.image=pygame.image.load(personajePrincipal.getImagen("n"))
                    Ppsprite.rect=pygame.image.load(personajePrincipal.getImagen("n")).get_rect()
                    Ppsprite.rect.top=actualTop
                    Ppsprite.rect.left=actualLeft
                    Ppsprite.rect.move_ip(0,-10)
                    if detectar_colisiones(scasas45,Ppsprite)==True or detectar_colisiones(npcs,Ppsprite)==True:
                        Ppsprite.rect.move_ip(0,10)
                if event.key==pygame.K_t:
                    if FlagHabla==False:
                        for i in range(0,len(npcs)):
                            if Ppsprite.rect.top-npcs[i].rect.top<=45 and Ppsprite.rect.top-npcs[i].rect.top>=-45:
                                if Ppsprite.rect.left-npcs[i].rect.left<=45 and Ppsprite.rect.left-npcs[i].rect.left>=-45:
                                    FlagHabla=True
                                    texto_personaje=mapaActual.npcs[i].textoDefault
                                    nom_personaje=mapaActual.nombre
                    else:
                        FlagHabla=False

                if event.key==pygame.K_p: #PAUSA
                    FlagPausa=True
                    while FlagPausa==True:
                        pantalla.blit(panelPausa,PantallaPausa.posicion)
                        for i in range(0,len(PantallaPausa.textos)):
                            panelPausa.blit(BAntiqueBookCover.render(PantallaPausa.textos[i],0,blanco),PantallaPausa.dirtext[i])
                        pygame.display.update()
                        for event in pygame.event.get():
                            if event.type == pygame.KEYDOWN:
                                if event.key==pygame.K_p:
                                    FlagPausa=False

                if event.key==pygame.K_F1:
                    if FlagShowHelp==False:
                        FlagShowHelp=True
                    else:
                        FlagShowHelp=False


        #moving npcs by cicle
        for i in range(0,len(npcs)):
            if ciclos[i]%ciclo==0:
                actualnpcTop=npcs[i].rect.top
                actualnpcLeft=npcs[i].rect.left
                mov=random.randrange(1,5)
                if mov==1: #nort
                    npcs[i].image=pygame.image.load(mapaActual.get_npc(i).get_image("n"))
                    npcs[i].rect=pygame.image.load(mapaActual.get_npc(i).get_image("n")).get_rect()
                    npcs[i].rect.top=actualnpcTop
                    npcs[i].rect.left=actualnpcLeft
                    npcs[i].rect.move_ip(0,-10)
                    if detectar_colisiones(scasas45,npcs[i])==True or detectar_colisiones_npc(npcs,npcs[i],i)==True:
                        npcs[i].rect.move_ip(0,10)
                if mov==2: #south
                    npcs[i].image=pygame.image.load(mapaActual.get_npc(i).get_image("s"))
                    npcs[i].rect=pygame.image.load(mapaActual.get_npc(i).get_image("s")).get_rect()
                    npcs[i].rect.top=actualnpcTop
                    npcs[i].rect.left=actualnpcLeft
                    npcs[i].rect.move_ip(0,10)
                    if detectar_colisiones(scasas45,npcs[i])==True or detectar_colisiones_npc(npcs,npcs[i],i)==True:
                        npcs[i].rect.move_ip(0,-10)
                if mov==3: #east
                    npcs[i].image=pygame.image.load(mapaActual.get_npc(i).get_image("e"))
                    npcs[i].rect=pygame.image.load(mapaActual.get_npc(i).get_image("e")).get_rect()
                    npcs[i].rect.top=actualnpcTop
                    npcs[i].rect.left=actualnpcLeft
                    npcs[i].rect.move_ip(10,0)
                    if detectar_colisiones(scasas45,npcs[i])==True or detectar_colisiones_npc(npcs,npcs[i],i)==True:
                        npcs[i].rect.move_ip(-10,0)
                if mov==4: #west
                    npcs[i].image=pygame.image.load(mapaActual.get_npc(i).get_image("w"))
                    npcs[i].rect=pygame.image.load(mapaActual.get_npc(i).get_image("w")).get_rect()
                    npcs[i].rect.top=actualnpcTop
                    npcs[i].rect.left=actualnpcLeft
                    npcs[i].rect.move_ip(-10,0)
                    if detectar_colisiones(scasas45,npcs[i])==True or detectar_colisiones_npc(npcs,npcs[i],i)==True:
                        npcs[i].rect.move_ip(10,0)
        #Loop de espera
        mainLoopTimer.tick(20)
        #-------------------------------
        #-----REDIBUJO DE PANTALLA------
        #-------------------------------
        #Pantalla
        imagen_fondo=pygame.image.load(mapaActual.get_fondo())
        pantalla.blit(imagen_fondo,(0,0))
        #Panel de datos del jugador
        pantalla.blit(panel,[0,550])
        texto=MAntiqueBookCover.render("Nombre: " + personajePrincipal.getNombre(),0,blanco)
        panel.blit(texto,[5,10])
        texto=SAntiqueBookCover.render("Fuerza: " + str(personajePrincipal.getFuerza()),0,blanco)
        panel.blit(texto,[200,10])
        texto=SAntiqueBookCover.render("Defensa: " + str(personajePrincipal.getDefensa()),0,blanco)
        panel.blit(texto,[200,25])
        texto=SAntiqueBookCover.render("Agilidad: " + str(personajePrincipal.getAgilidad()),0,blanco)
        panel.blit(texto,[300,10])
        texto=SAntiqueBookCover.render("Velocidad: " + str(personajePrincipal.getVelocidad()),0,blanco)
        panel.blit(texto,[300,25])

        #Imagenes
        for i in range(0,len(imagenes)):
            pantalla.blit(imagenes[i],(mapaActual.get_some_imagenx(i),mapaActual.get_some_imageny(i)))

        #Jugador
        pantalla.blit(Ppsprite.image,Ppsprite.rect)

        #Edificaciones
        for i in scasas45:
            pantalla.blit(i.image,i.rect)

        #NPC
        for i in npcs:
            pantalla.blit(i.image,i.rect)

        #Pantalla de Help
        if FlagShowHelp==True:
            pantalla.blit(panelHelp,PantallaHelp.posicion)
            for i in range(0,len(PantallaHelp.textos)):
                panelHelp.blit(BAntiqueBookCover.render(PantallaHelp.textos[i],0,blanco),PantallaHelp.dirtext[i])

        #Conversacion con un npc
        if FlagHabla==True:
            if texto_personaje!="":
                panelPersonaje=pygame.Surface([400,200])
                panelPersonaje.fill(negro)
                texto=BAntiqueBookCover.render(nom_personaje,0,azul)
                panelPersonaje.blit(texto,[1,1])
                texto=BAntiqueBookCover.render(texto_personaje,0,blanco)
                panelPersonaje.blit(texto,[1,30])
                pantalla.blit(panelPersonaje,[100,100])

        pygame.display.update()

        #aumento el ciclo
        ciclo=ciclo+1
    pygame.quit()

main()
